#ifndef FILTERRENDERADAPTER_H
#define FILTERRENDERADAPTER_H
#include "logUtils.h"
#include "stringutils.h"
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#include "libswscale/swscale.h"
#include "libavfilter/buffersrc.h"
#include "libavfilter/buffersink.h"
#include "libswresample/swresample.h"
#include "libavutil/opt.h"
#include "libavformat/avio.h"
#include "libavutil/timestamp.h"
#include "libavutil/imgutils.h"
}

class FilterRenderAdapter
{
public:
    FilterRenderAdapter();
    ~FilterRenderAdapter();
//    /**
//     * 初始化Adapter
//     * @param dec_ctx AVCodecContext
//     * @param img_path 水印的图片
//     * @return
//     */
//    int initAdapter(int main_width,int main_height,
//                    AVPixelFormat main_pix_fmt,AVRational main_sample_aspect_ratio,
//                    int logo_width,int logo_height,
//                    AVPixelFormat logo_pix_fmt,AVRational logo_sample_aspect_ratio,
//                    int x,int y);

    /**
     * 初始化filter适配器
     * @brief initAdapter
     * @param logo_file 水印图片
     * @param main_width 视频宽度
     * @param main_height 视频高度
     * @param main_pix_fmt 视频格式
     * @param main_sample_aspect_ratio
     * @param x 水印位置x坐标
     * @param y 水印位置y坐标
     * @return
     */
    int initAdapter(const char *logo_file,int main_width,int main_height,
                                         AVPixelFormat main_pix_fmt,AVRational main_sample_aspect_ratio,
                                         int x,int y);

    /**
     * 初始化filter适配器
     * @brief initAdapter
     * @param logo_file 水印图片
     * @param main_width 视频宽度
     * @param main_height 视频高度
     * @param main_pix_fmt 视频格式
     * @param main_sample_aspect_ratio
     * @param offsetX 视频的宽度-图片的宽度-offsetX
     * @param offsetY 视频的高度-图片的高度-offsetY
     * @return
     */
    int initAdapter(const char *logo_file,int main_width,int main_height,
                                         AVPixelFormat main_pix_fmt,AVRational main_sample_aspect_ratio,
                                         double offsetX,double offsetY);

    int initAdapter(int main_width, int main_height, AVPixelFormat main_pix_fmt, AVRational main_sample_aspect_ratio, int logo_width, int logo_height, AVPixelFormat logo_pix_fmt, AVRational logo_sample_aspect_ratio, int x, int y);

    /**
     * 合成水印调用
     * 在视频解码后，编码前调用
     * @param v_frame 视频帧数据
     * @param logo_frame 水印帧数据
     * @param paint_frame 最终合成的视频帧数据
     * @return
     */
    int onConvert(AVFrame *main_frame, AVFrame *logo_frame,AVFrame *paint_frame);

    /**
     * 合成水印调用
     * 在视频解码后，编码前调用
     * @param v_frame 视频帧数据
     * @param paint_frame 最终合成的视频帧数据
     * @return
     */
    int onConvert(AVFrame *main_frame, AVFrame **paint_frame);

    /**
     * 销毁引用
     * @brief deInit
     * @return
     */
    void deInit();

private:
    AVFilterInOut *avfilter_inputs = NULL;
    AVFilterInOut *avfilter_outputs = NULL;
    AVFilterContext *buffersink_ctx;
    AVFilterContext *buffersrc_ctx;
    AVFilterGraph *filter_graph;
    char filter_args[1024] = { 0 };
    AVFilterContext *avfilter_main_ctx, *avfilter_logo_ctx, *avfilter_paint_ctx = nullptr;
private:
    int initFilter(int main_width,int main_height,
                                        AVPixelFormat main_pix_fmt,AVRational main_sample_aspect_ratio,
                                        const char *log_ctx);
    int init_filter(int main_width,int main_height,
                    AVPixelFormat main_pix_fmt,AVRational main_sample_aspect_ratio,int logo_width,int logo_height,
                    AVPixelFormat logo_pix_fmt,AVRational logo_sample_aspect_ratio,int x, int y);
};

#endif // FILTERRENDERADAPTER_H
